#pragma once

#include "Misc/EngineEditorMacros.h"
#include "Project/ProjectViewModelSubsystem.h"
#include "Asset/AssetHead.h"
#include "Asset/AssetSubsystem.h"
#include "Path/Path.h"
#include "ProjectAssetInfo.h"
#include "Containers/Map.h"
#include "ProjectAssetSubsystem.m.h"



//用于操作资产的子系统
RCLASS()
class RProjectAssetSubsystem: public RProjectViewModelSubsystem 
{
    ROBJECT

public:

    virtual void Initialize() override;
    virtual void Deinitialize(){};

    //重命名资产
    //并且显示一个模态对话框展示重命名的进度
    void RenameAssetWithDialog(
        const SPath& OldAssetFilePath,
        const SPath& NewAssetFilePath
    ); 

    //删除资产
    //并且显示一个模态对话框展示删除的进度
    void DeleteAssetWithDialog(
        const SPath& AssetFilePath
    );

    //探测资产信息，生成并注册资产信息
    //如果已经注册了，直接返回
    //如果没有探测到资产信息，返回空
    TOptional<SProjectAssetInfo> DetectAssetInfo(const SPath& AssetFilePath);
    
    //注册资产信息。当创建资产时，需要注册资产信息
    void RegisterAssetInfo(
        const SPath& AssetFilePath,
        const SProjectAssetInfo& AssetInfo
    );

    //反注册资产信息，当删除资产时，需要反注册资产信息
    void UnregisterAssetInfo(
        const SPath& AssetFilePath
    );

    //找到指定类的所有资产
    TVector<SProjectAssetInfo> GenerateAssetListByClass(CClass* InClass);

    //异步加载指定资产的缩略图
    //如果是空的资产，返回一个空资产缩略图
    //如果有缓存的缩略图，直接返回缓存
    void AsyncLoadThumbnail(
        const SPath& AssetFilePath,
        TDelegate<void,TSharedObjectPtr<RTexture2D>> Callback
    );  

protected:
    //当前项目的资产包
    SAssetPackage ProjectAssetPackage ;

    TSharedObjectPtr<RTexture2D> EmptyAssetThumbnail;

    TMap<SPath /*资产文件的绝对路径*/, SProjectAssetInfo> 
        DetectedAssetInfos;

    //从资产文件创建资产信息
    TOptional<SProjectAssetInfo>
        CreateAssetInfo(const SPath& AssetFilePath);
    
    SProjectAssetInfo CreateAssetInfo(
        const SPath& AssetFilePath,
        const SAssetHead& InAssetHead
    );

};